
package com.monlyu.bo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.ListUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.google.common.collect.Maps;
import com.monlyu.bean.Page;
import com.monlyu.bean.Pages;
import com.monlyu.util.LogUtil;
import com.monlyu.vo.Enums;

/*******************************************************************************
 * <b>功能描述☞</b>关于枚举类型的所有Bo对象<br>
 * <b>开发公司☞</b>重庆唯尼科技有限公司<br>
 * <b>版权☞</b>本文件归重庆唯尼科技有限公司所有<br>
 * <b>项目名☞</b>NewsSys<br>
 * <b>文件路径☞</b>com.monlyu.bo.EnumsBo.java<br>
 * <b>开发日期☞</b>2010-2-10 <br>
 * 
 * @author monlyu
 * @since JDK 5
 * @version 1.0.8
 ******************************************************************************/
@Repository(value = "enumsBo")
public class EnumsBo extends BaseBo {

    // 把表中的数据全部查出来,放到变量中
    private static Map<Long, String> ENUMS_MAP_CACHE = new HashMap<Long, String>();
    private static Map<Long, String> ENUMS_VALUE_CACHE = new HashMap<Long, String>();
    private static Map<String, List<Enums>> ENUMS_SELECT_CACHE = Maps.newHashMap();

    /**
     * 获取可用的枚举类新.不包括已经失效的
     * 
     * @param 枚举类型的类型
     * @author monlyu
     * @since 2010-1-30
     */
    public List<Enums> getEnumsByType(String type){
        if (type == null) {
            return ListUtils.EMPTY_LIST;
        }
        Criteria criteria = dao.initCriteria(Enums.class);
        criteria.add(Restrictions.eq("type", type));
        return criteria.list();
    }

    /**
     * 选择标签的缓存,如果更改枚举,请刷新缓存
     * 
     * @since 2010-2-12
     */
    public List<Enums> getEnumsNoDisable(String type){
        if (type == null) {
            return ListUtils.EMPTY_LIST;
        }
        List<Enums> reslut = null;
        if (!type.toLowerCase().equals("dept.type")) {
            reslut = ENUMS_SELECT_CACHE.get(type);
        }
        if (reslut == null) {
            Criteria criteria = dao.initCriteria(Enums.class);
            criteria.add(Restrictions.eq("type", type));
            criteria.add(Restrictions.eq("disable", false));
            ENUMS_SELECT_CACHE.put(type, criteria.list());
            reslut = ENUMS_SELECT_CACHE.get(type);
        }

        return reslut;
    }

    /**
     * 当修改的时候,清空对应的缓存信息
     * 
     * @since 2010-2-12
     */
    public void clearSelectCache(String type){
        ENUMS_SELECT_CACHE.remove(type);
        LogUtil.logWithTime(getClass(), "清空枚举下拉选择缓存:类型" + type + " 成功:" + (ENUMS_SELECT_CACHE.get(type) == null));
    }

    /**
     * 获取Enum中的key值
     * 
     * @author monlyu
     * @since 2010-1-31
     */
    public Object getEnumValue(Long value){
        if (value == 0) {
            return "";
        }
        String data = ENUMS_MAP_CACHE.get(value);
        if (data == null) {
            for (Enums enu : dao.find(Enums.class)) {
                ENUMS_MAP_CACHE.put(enu.getId(), enu.getKey());
            }
            data = ENUMS_MAP_CACHE.get(value);
        }
        return data;
    }

    /**
     * 获取Enum中的value值
     * 
     * @param value
     * @return
     * @since chendan 2010-3-9
     */
    public Object getValue(Long value){
        if (value == 0) {
            return "";
        }
        String data = ENUMS_VALUE_CACHE.get(value);
        if (data == null) {
            for (Enums enu : dao.find(Enums.class)) {
                ENUMS_VALUE_CACHE.put(enu.getId(), enu.getValue());
            }
            data = ENUMS_VALUE_CACHE.get(value);
        }
        return data;
    }

    /**
     * 检查枚举的key是否相同
     * 
     * @since 2010-2-10
     */
    public boolean checkOneKey(Enums enums2){
        return false;
    }

    public List<Enums> getSuper(String type){
        if (type == null) {
            return ListUtils.EMPTY_LIST;
        }
        Criteria criteria = dao.initCriteria(Enums.class);
        criteria.add(Restrictions.eq("type", type));
        criteria.add(Restrictions.eq("disable", false));
        criteria.add(Restrictions.isNull("supor"));
        return criteria.list();
    }

    @Override
    public void save(Object entity){
        Enums enums = (Enums) entity;
        if (enums.getId() != null) {
            ENUMS_MAP_CACHE.remove(enums.getId());
        }
        clearSelectCache(enums.getType());
        super.save(entity);
    }

    /**
     * 查找枚举对象
     * 
     * @since 2010-2-11
     */
    public Pages<Enums> build(Page defPage){
        Criteria criteria = dao.initCriteria(Enums.class);
        criteria.add(Restrictions.eq("type", "program.type"));
        return buildPages(defPage, criteria, "key", "comment");
    }

    /**
     * 根据ID数组来获取enmus对象
     */
    public List<Enums> getEnumsByIds(Object... ids){
        Criteria criteria = dao.initCriteria(Enums.class);
        if (ids != null && ids.length > 0) {
            criteria.add(Restrictions.in("id", ids));
        } else {
            criteria.add(Restrictions.eq("id", Long.valueOf("0")));
        }
        return criteria.list();
    }
}
